#ifndef IP_FILTER_H
#define IP_FILTER_H

#include <map>
#include <memory>

#include "ip_addr.h"

using namespace std;

namespace secsmart_tcpip
{
enum {
    IP_FILTER_MODE_NULL = 0,     // 不进行过滤
    IP_FILTER_MODE_BACKLIST = 1, // 黑名单过滤,命中黑名单的报文丢弃。
    IP_FILTER_MODE_WHITELIST = 2  //  白名单过滤,命中白名单的报文继续处理。
};

enum {
    RULE_TYPE_BACKLIST = 1, // 黑名单
    RULE_TYPE_WHITELIST = 2  //  白名单
};

struct IpRange {
    IPAddress begin;
    IPAddress end;
    bool check(const IPAddress &ip) { return !((ip < begin) || (end < ip)); }
};

struct IpFilterRule {
    uint32_t rule_id;
    IpRange ip_range;
    bool enable;
    uint8_t type;
};

class IpFilter
{
  public:
    IpFilter() : mode_(IP_FILTER_MODE_NULL){};
    void set_filter_mode(uint8_t mode) { mode_ = mode; }
    void add_rule(const IpFilterRule &rule);
    void del_rule(uint32_t rule_id);
    bool filter_ip(IPAddress &ip);
    uint32_t get_rule_num(uint8_t type);

  private:
    uint8_t mode_;                            // 默认为过滤IP类型IP_FILTER_BACKLIST
    map<uint32_t, IpFilterRule> black_rules_; // key 为rule_id
    map<uint32_t, IpFilterRule> white_rules_; // key 为rule_id
};
} // namespace secsmart_tcpip

#endif /* IP_FILTER_H */
